<?php
	
	/**	Facil Lite
	 * 	
	 * 	Pensando em simplificar, considere que existem apenas duas entidades: Folder e File
	 *  
	 *  FOLDER pode ser:
	 *  - Módulo
	 *  - Site
	 *  - Categoria
	 *  
	 *  FILE pode ser:
	 *  - Script
	 *  - Template
	 * 	- Template publicado
	 * 
	 * 	
	 * 	Este index.php analisa o request e carrega o folder/file necessário, dentro da pasta ROOT do site,
	 * 	definida logo no início do script.
	 * 	
	 */
	
	ini_set('default_charset','UTF-8');
	
	// 	ROOT - Pasta em que o site estará efetivamente.
	defined('ROOT') || define('ROOT', 'public', true);
	set_include_path(ROOT);
	
	// domain - isso aqui é só por causa do localhost, mas pode ser útil no servidor algum dia.
	$domain = ($_SERVER['REMOTE_ADDR'] == "127.0.0.1") ? "/eleazar2" : "";
	
	$ServerRequestUri = $_SERVER['REQUEST_URI'];
	$ServerRequestUri = str_replace($domain, "", $ServerRequestUri); 
	
	// tirando barra final do Request_Uri, se tiver.
	$strlen = strlen($ServerRequestUri);
	$ServerRequestUri = (substr($ServerRequestUri,$strlen-1,$strlen) == "/") ? substr($ServerRequestUri,0,$strlen-1) : $ServerRequestUri ;
	
	// extens�o de resposta que o request espera (ver settings.php -> $VALID_EXT )
	$tempExt = explode(".", $ServerRequestUri);
	
	$REQUEST_SLUG = "";
	if(count($tempExt) > 1){
		for($i=0; $i<count($tempExt)-1; $i++){
			if($i>0){ $REQUEST_SLUG .= "."; }
			$REQUEST_SLUG .= $tempExt[$i];
		}
	} else {
		$REQUEST_SLUG .= $tempExt[0];
	}
	$RESPONSE_EXT = (count($tempExt) > 1) ? $tempExt[count($tempExt)-1] : false;
	
	// removendo parâmetros get
	$GET = strstr($ServerRequestUri, "?");
	$ServerRequestUri = str_replace($GET, "", $ServerRequestUri);
	
	$level = explode("/", $ServerRequestUri);
	
	
	/**	Settings
	 * 	
	 * 	Os settings definem como se comporta cada pasta;
	 * 	Inclui settings em cascata. Se uma pasta n�o tem settings, vai pegando das 
	 * 	pastas anteriores. Tipo htaccess.
	 * 
	 * 	INCLUDE FOLDER
	 * 	$includeFolder é a última pasta que realmente existe que está no request. 
	 * 	
	 */
	
	include("settings.php");
	$includeFolder = ROOT;
	$temp = "";
	for($i=0; $i<count($level); $i++){
		$temp .= $level[$i]."/";
		if(is_dir(ROOT.$temp)){
			$includeFolder .= $temp;
			if(file_exists($includeFolder."settings.php")){
				include_once($includeFolder."settings.php");
			}
		}
	}
	
	/**	
	 * 	instancia classes úteis do projeto
	 */
	// OBS: implementar busca recursiva por pasta, estudar o caso mais a fundo (sem go horse)
	foreach($UTILS as $tempUtilClass){
		include_once("class/utils/$tempUtilClass.class.php");
		$$tempUtilClass = new $tempUtilClass();
	}
	
	/**
	 * 	Verificações de login
	 * 	Se está logado
	 * 	Se tem permissão pra acessar a pasta
	 * 	permissão de arquivo fica dentro da pasta
	 */
	//debugg($_SESSION);
	($NEED_LOGIN && !isset($_SESSION['login'])) && header("Location: ".$domain."/user/login");
	($NEED_LOGIN && isset($_SESSION['utype']) && !in_array($_SESSION['utype'], $USER_TYPE)) && header("Location: ".$domain."/403");
	
	/**
	 * 	REQUESTS POSSÍVEIS
	 * 	
	 * 	site.com/pasta 			-> pega o index.php	
	 * 	site.com/arquivo.ext	-> pega o arquivo
	 * 							else vai pro index.php da última pasta válida
	 * 	site.com/arquivo		-> pega o arquivo com a extensão que tiver 
	 * 							else vai pro index.php da última pasta válida
	 */	
	
	$include = ROOT.$ServerRequestUri;
	
	if(file_exists($include)){
		
		(is_file($include) && include($include)) && exit();
		
		( (is_dir($include) && file_exists($include."/index.php") ) && include($include."/index.php")) ? exit() : ((file_exists($include."/$DEFAULT_TEMPLATE_PATH/index.php") && include($include."/$DEFAULT_TEMPLATE_PATH/index.php")) ? exit() : header("Location: ".$domain."/404") ); 
			
	} else {
		
		/**
		 * 	Se o request tem extens�o, e a extensão esitver no array de extens�es
		 * 	pra buscar recursivo $RECURSIVE_SEARCH_EXT (settings.php), entra aqui.
		 * 	
		 * 	Exemplo:
		 * 	REQUEST -> site.com/hotsite/categoria/subcategoria/arquivo.css
		 * 	REALIDADE -> site.com/hotsite/arquivo.css
		 * 	
		 * 	Pro request encontrar a realidade, a extensão tem que estar no settings.php
		 * 
		 */
		
		if(in_array($RESPONSE_EXT, $RECURSIVE_SEARCH_EXT)){ //css, js, jpg, gif, etc...
			
			$Navigation->setHeaderContentType($RESPONSE_EXT);
			
			$temp = $level;
			unset($temp[count($level)-1]);
			$file = "/".$level[count($level)-1];
			$path = implode("/", $level);
			$path = str_replace($file, "", $path);
			
			for($i=count($level)-1; $i>=0; $i--){
				
				(is_file(ROOT.$path.$file) && include(ROOT.$path.$file)) && exit();
				
				if(isset($temp[$i-1])){
					if(in_array($temp[$i-1],$RECURSIVE_EXCEPTION_FOLDER)){ // css/ js/ img/ etc...
						unset($temp[$i-2]);
					} else {
						unset($temp[$i-1]);
					}
				} else {
					break;
				}
				
				$temp = array_values($temp);
				$path = implode("/", $temp);
			}
		}
		
		
		/**
		 * 	se é script, o sistema fará o ritual: start -> script -> resposta (template)
		 * 	isso é aplicável tanto pra script de módulo tradicional (commit.php, por exemplo)
		 * 	como listagens dinâmicas, como listagem de categoria através do banco, por exemplo.
		 */

		
		$scriptRequest = $level[count($level)-1];
		$scriptRequestTempArray = explode(".", $scriptRequest);
		$scriptRequest = $scriptRequestTempArray[0];
		
		$responseExtFolder = ($RESPONSE_EXT) ? $RESPONSE_EXT."/" : $DEFAULT_TEMPLATE_PATH."/" ;
		
		$_start = $includeFolder."start.".$DEFAULT_EXT;
		$_script = ROOT.$ServerRequestUri.".".$DEFAULT_EXT;
		$_template = $includeFolder.$responseExtFolder.$scriptRequest.".".$DEFAULT_EXT;
		
		// verificando permissão do script
		(in_array($scriptRequest,$SCRIPT_NEED_LOGIN) && !isset($_SESSION['login'])) && header("Location: ".$domain."/user/login");
		(in_array($scriptRequest,$SCRIPT_NEED_LOGIN) && isset($_SESSION['utype']) && !in_array($_SESSION['utype'], $SCRIPT_USER_TYPE)) && header("Location: ".$domain."/403");
		
		file_exists($_start) && include($_start);
		file_exists($_script) && include($_script);
		
		/**	MUITO IMPORTANTE!
		 * 	Aqui estou tirando a Controller da mão do programador frontend
		 * 	E deixando só a VO (morta) pra ele
		 */
		(isset($Controller) && $VO = $Controller->VO) && $Controller = false;
		($_template != $_script && file_exists($_template)) && include($_template);
		
		// if debug..
		$Navigation->debugg() && debugg(get_included_files());
		$Navigation->debugg() && debugg($_start, "start");
		$Navigation->debugg() && debugg($_script, "script");
		$Navigation->debugg() && debugg($_template, "template");
		$Navigation->debugg() && debugg($_POST, "POST");
		$Navigation->debugg() && debugg($_GET, "GET");
		
		exit();
	
	}
	
?>